#ifndef TYPE_TRAITS_HPP_DEF
#define TYPE_TRAITS_HPP_DEF
namespace TingSTL {
// ////////////////////////  void_t ////////////////////////
template <typename...>
using void_t = void;

// ////////////////////////  integral_constant ////////////////////////
template <typename T, T Val>
struct integral_constant {
    static constexpr T value = Val;
};

template <bool Val>
using bool_constant = integral_constant<bool, Val>;

using true_type = bool_constant<true>;
using false_type = bool_constant<false>;

// ////////////////////////  enable_if ////////////////////////
template <bool Test, class T = void>
struct enable_if {}; // false , 没有定义 T

template <class T>
struct enable_if<true, T> {
    using type = T; // true ， 定义 T
};

template <bool _Test, class _Ty = void>
using enable_if_t = typename enable_if<_Test, _Ty>::type;

}; // namespace TingSTL

#endif // TYPE_TRAITS_HPP_DEF